package com.itheima.arraydemo;

import org.w3c.dom.ls.LSOutput;

import java.util.Random;

/*
 *
 *      对二维数组的打乱
 *
 *
 * */
//注意类名
public class ArrayDemo08 {
    /* //程序的主入口,main方法
     public static void main(String[] args) {
         //定义二维数组
         int[][] arr = {
                 {1, 2, 3, 4},
                 {5, 6, 7, 8},
                 {9, 10, 11, 12},
                 {13, 14, 15, 16}
         };

         //创建随机数对象
         Random r = new Random();

         //变量二维数组
         for (int i = 0; i < arr.length; i++) {
             for (int j = 0; j < arr[i].length; j++) {
                 //重点:获取到两个随机索引,因为二维数组是有两个索引-------->
                 // 逻辑就是随机找到一个一维数组,再在这个一维数组中找到一个随机元素,与遍历的数据进行交换
                 int x = r.nextInt(arr.length);//x:代表二维数组中的哪一个一维数组
                 int y = r.nextInt(arr[x].length);//y:代表这个一维数组中的那一个位置

                 //对数据进行交换
                 int temp = arr[i][j];
                 arr[i][j] = arr[x][y];
                 arr[x][y] = temp;
              }
         }


 //        遍历二维数组
         //遍历二维数组 arr.fori
         for (int i = 0; i < arr.length; i++) {
             //遍历二维数组 arr[i].fori
             for (int j = 0; j < arr[i].length; j++) {
                 //对一维数组中的元素进行打印
                 System.out.print(arr[i][j] + " ");
             }
             //打印完一个一维数组,就换行
             System.out.println();
         }
     }*/
    //第一遍
    //程序的主入口,也是程序开始的地方
    public static void main(String[] args) {
        //定义数组-------->用第一种格式,简化版 且静态初始化
        int[][] arr = {
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 10, 11, 12},
                {13, 14, 15, 16}
        };
        //创建随机数对象
        Random random = new Random();
        //遍历二维组,做交换操作
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                //获取两个随机索引
                int x = random.nextInt(arr.length);
                int y = random.nextInt(arr[x].length);
                //进行数据交换
                swap(arr, i, j, x, y);
            }
        }
        //调用方法对数组进行遍历
        printArray(arr);

    }

    //定义一个方法,用于数据交换
    //两个明确 1.参数列表 2.返回值类型
    //分析: 需要两个减缓的数据 不需要返回值类型 要多数组修改就需要数组,否则改的副本
    public static void swap(int[][] array, int index1, int index2, int index3, int index4) {
        int temp = array[index1][index2];  // 通过索引直接读取数组的值
        array[index1][index2] = array[index3][index4];  // 通过索引直接修改数组
        array[index3][index4] = temp;
    }


    //定义一个方法,用于遍历二维数组
    //两个明确 1.参数列表 2.返回值类型
    //分析 需要一个二维数组作为原材料 不许要返回值类型
    public static void printArray(int[][] arr) {
        //遍历
        //先遍历二维数组中的一维数组
        for (int i = 0; i < arr.length; i++) {
            //在遍历一维数组中的元素
            for (int j = 0; j < arr[i].length; j++) {
                //对一维数组中的元素进行打印
                System.out.print(arr[i][j] + " ");
            }
            //没遍历完一个一维数组,就换一行
            System.out.println();
        }
    }
}
